#include "Plane.h"
#include "Define.h"

namespace Math{

Plane::Plane(Vector pos,Vector norm){
    m_Position = pos;
    m_Normal = norm.normal();
}
    
Vector& Plane::getNormal(){
    return m_Normal;
}

Vector& Plane::getPosition(){
    return m_Position;
}

bool Plane::intersects(Ray& ray,float &distance, Math::Vector &v){
    /// Si le produit scalaire de deux vecteurs est nul           
    float kappa = ray.getDirection().dot(m_Normal);
    /// les deux vectors sont perpendiculaires, or la 
    /// normale du triangle est perpendiculaire au plan
    /// si kappa est nul, le rayon et le plan sont parallèles
    if (kappa==0.0f){
        /// On pourrait aussi vérifier que les deux ne sont
        /// pas confondus.
        return false;
    }
    /// On cherche theta(voir document de reference)
    /// qui est le coefficient d'intersection du rayon
    /// avec le triangle ( pt_intersection = theta*direction + origine)
    float theta = (v).dot(m_Normal)/kappa;
    /// On ne veut pas non plus que le triangle soit derrière le rayon:
    if (theta<0)
        return false;

	if (theta > EPSILON && theta < distance) {
        distance = theta;
		return true;
	}

	return false;
}
void Plane::getIntersectionParams(Ray &ray,const float t, Vector *normal, Vector *uv){
	
    (void) t;// avoid warning about unused parameter 
    (void) uv;
    (void) ray;           
	
    if (normal!=NULL){
        *normal = m_Normal;
    }
}
}//namespace
